<div>
  Definisce un'espressione logica che determina quali agenti possano eseguire
  le compilazioni di questo progetto. Quest'espression, se testata con il
  nome e le etichette di ogni agente disponibile, sarà valutata come
  <i>true</i> o <i>false</i>. Se l'espressione viene valutata come <i>true</i>,
  allora a tale agente sarà consentito eseguire le compilazioni di questo
  progetto.
  <p>
  Se questo progetto dovrebbe essere sempre compilato su un agente specifico,
  o sul nodo master Jenkins, allora si dovrebbe immettere semplicemente,
  rispettivamente, il nome dell'agente o <code>master</code>.
  <p>
  Ciò nonostante, si dovrebbe generalmente evitare di usare il <i>nome</i> di
  un agente in questo campo, preferendo le <i>etichette</i> di un agente.
  Come documentato sulla pagina di configurazione di ogni agente e sulla
  pagina <i>Configura sistema</i> del nodo master, è possibile utilizzare
  etichette per rappresentare il sistema operativo su cui è in esecuzione
  l'agente, la sua architettura CPU o un qualunque numero di altre
  caratteristiche.
  <br>
  L'utilizzo delle etichette fa venir meno la necessità di riconfigurare
  l'espressione etichetta immessa in questo campo ogni volta che si aggiungono,
  rimuovono o ridenominano agenti.
  <p>
  Un'espressione etichetta può essere semplicemente una singola
  <b>etichetta</b> o <b>nome agente</b>, ad esempio
  <code>android-builder</code> o <code>linux-machine-42</code>.<br>
  È possibile inoltre utilizzare svariati <i>operatori</i> per creare
  espressioni più complesse.

  <h3>Operatori supportati</h3>
  Sono supportati i seguenti operatori in ordine di precedenza decrescente:
  <dl>
    <dt><tt>(espressione)</tt></dt>
    <dd>
      parentesi — utilizzate per definire esplicitamente l'associatività
      di un'espressione
    </dd>

    <dt><tt>!espressione</tt></dt>
    <dd>
      NOT — negazione; il risultato di <tt>espressione</tt> <b>non</b>
      dev'essere vero
    </dd>

    <dt><tt>a &amp;&amp; b</tt></dt>
    <dd>
      AND — <b>entrambe</b> le espressioni <tt>a</tt> e <tt>b</tt> devono
      essere vere
    </dd>

    <dt><tt>a || b</tt></dt>
    <dd>
      OR — <b>una</b> delle espressioni <tt>a</tt> o <tt>b</tt> può essere vera
    </dd>

    <dt><tt>a -> b</tt></dt>
    <dd>
      operatore "implica" — equivalente ad <tt>!a || b</tt>.<br>
      Ad esempio, <tt>windows -> x64</tt> può essere interpretato come "se
      viene utilizzato un agente Windows, allora tale agente <i>deve</i>
      essere a 64 bit", consentendo comunque l'esecuzione su qualunque agente
      che <i>non</i> abbia l'etichetta <tt>windows</tt>, a prescindere dal
      fatto che abbia l'etichetta <tt>x64</tt>
    </dd>

    <dt><tt>a &lt;-> b</tt></dt>
    <dd>
      operatore "se e solo se" — equivalente a <tt>a &amp;&amp; b ||
      !a &amp;&amp; !b</tt><br>
      Ad esempio, <tt>windows &lt;-> dc2</tt> può essere interpretato come
      "se viene utilizzato un agente Windows, allora tale agente <i>deve</i>
      essere nel datacenter 2, ma se viene utilizzato un agente non Windows,
      allora <i>non deve</i> essere nel datacenter 2"
    </dd>
  </dl>

  <h3>Note</h3>
  <ul>
    <li>
      Tutti gli operatori sono associativi a sinistra, ossia
      <tt>a -> b -> c</tt> è equivalente ad <tt>(a -> b) -> c</tt>.
    </li>
    <li>
      Le etichette o i nomi degli agenti possono essere racchiusi da
      virgolette doppie se contengono caratteri che andrebbero in conflitto con
      la sintassi degli operatori.<br>
      Ad esempio, <tt>"osx (10.11)" || "Windows Server"</tt>.
    </li>
    <li>
      Le espressioni possono essere scritte senza spazi bianchi, ma includerli
      è raccomandato per questioni di leggibilità; Jenkins ignorerà gli spazi
      bianchi durante la valutazione delle espressioni.
    </li>
    <li>
      La ricerca di corrispondenze fra etichette o nomi agenti con
      espressioni con caratteri jolly o espressioni regolari non è supportata.
    </li>
    <li>
      Un'espressione vuota verrà sempre valutata come <i>true</i> e
      corrisponderà a tutti gli agenti.
    </li>
  </ul>

  <h3>Esempi</h3>
  <dl>
    <dt><tt>master</tt></dt>
    <dd>
      Le compilazioni di questo progetto possono eseguite solo sul nodo
      master di Jenkins
    </dd>

    <dt><tt>linux-machine-42</tt></dt>
    <dd>
      Le compilazioni di questo progetto possono essere eseguite solo
      sull'agente denominato <tt>linux-machine-42</tt> (o su qualunque sistema
      che abbia un'etichetta denominata <tt>linux-machine-42</tt>)
    </dd>

    <dt><tt>windows &amp;&amp; jdk9</tt></dt>
    <dd>
      Le compilazioni di questo progetto possono essere eseguite solo su un
      qualunque agente Windows che abbia installata la versione 9 del Java
      Development Kit (assumendo che agli agenti su cui sia installato JDK 9
      sia stata assegnata l'etichetta <tt>jdk9</tt>)
    </dd>

    <dt><tt>postgres &amp;&amp; !vm &amp;&amp; (linux || freebsd)</tt></dt>
    <dd>
      Le compilazioni di questo progetto possono essere eseguite solo su
      qualunque agente Linux o FreeBSD fintantoché <i>non</i> siano una
      macchina virtuale e abbiano PostgreSQL installato (assumendo che ogni
      agente abbia le etichette appropriate — in particolare, ogni agente in
      esecuzione in una macchina virtuale deve avere l'etichetta <tt>vm</tt>
      affinché quest'esempio funzioni come atteso)
    </dd>

  </dl>
</div>
